package com.gdyx.bc.gw.web;

import com.fasterxml.jackson.databind.deser.Deserializers;
import com.gdyx.bc.gw.sdk.unionpay.*;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by mac on 2017/5/13.
 */
public class BaseController {
    //默认配置的是UTF-8
    public static String encoding = "UTF-8";

    //二维码报文版本号
    public static String version = "1.0.0";

    //绑卡报文版本号
    public static String bind_card_version = "5.0.0";

    //前台通知地址样例
    public static String frontUrl = "http://localhost:8080/QRCSample/frontRcvResponse";

    // 商户发送交易时间 格式:YYYYMMDDhhmmss
    public static String getCurrentTime() {
        return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
    }

    public static String getCurrentDate() {
        return new SimpleDateFormat("yyyyMMdd000000").format(new Date());
    }

    // AN8..40 商户订单号，不能含"-"或"_"
    public static String getOrderId() {
        return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
    }

    /**
     * 组装请求，返回报文字符串用于显示
     * @param data
     * @return
     */
    public static String genHtmlResult(Map<String, String> data){

        TreeMap<String, String> tree = new TreeMap<String, String>();
        Iterator<Map.Entry<String, String>> it = data.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, String> en = it.next();
            tree.put(en.getKey(), en.getValue());
        }
        it = tree.entrySet().iterator();
        StringBuffer sf = new StringBuffer();
        while (it.hasNext()) {
            Map.Entry<String, String> en = it.next();
            String key = en.getKey();
            String value =  en.getValue();
            if("couponInfo".equals(key)){
                try {
                    String decodedCouponInfo = AcpService.base64Decode(value, BaseController.encoding);
                    sf.append("<b>couponInfo解base64后的值="+ decodedCouponInfo +"</br></b>");
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if("respCode".equals(key)){
                sf.append("<b>"+key + SDKConstants.EQUAL + value+"</br></b>");
            }else
                sf.append(key + SDKConstants.EQUAL + value+"</br>");
        }
        return sf.toString();
    }
    /**
     * 功能：解析全渠道商户对账文件中的ZM文件并以List<Map>方式返回
     * 适用交易：对账文件下载后对文件的查看
     * @param filePath ZM文件全路径
     * @return 包含每一笔交易中 序列号 和 值 的map序列
     */
    public static List<Map> parseZMFile(String filePath){
        int lengthArray[] = {3,11,11,6,10,19,12,4,2,21,2,32,2,6,10,13,13,4,15,2,2,6,2,4,32,1,21,15,1,15,32,13,13,8,32,13,13,12,2,1,131};
        return parseFile(filePath,lengthArray);
    }

    /**
     * 功能：解析全渠道商户对账文件中的ZME文件并以List<Map>方式返回
     * 适用交易：对账文件下载后对文件的查看
     * @param filePath ZME文件全路径
     * @return 包含每一笔交易中 序列号 和 值 的map序列
     */
    public static List<Map> parseZMEFile(String filePath){
        int lengthArray[] = {3,11,11,6,10,19,12,4,2,21,2,32,2,6,10,13,13,4,15,2,2,6,2,4,32,1,21,15,1,15,32,13,13,8,32,13,13,12,2,1,131};
        return parseFile(filePath,lengthArray);
    }

    /**
     * 功能：解析全渠道商户 ZM,ZME对账文件
     * @param filePath
     * @param lengthArray 参照《全渠道平台接入接口规范 第3部分 文件接口》 全渠道商户对账文件 6.1 ZM文件和6.2 ZME 文件 格式的类型长度组成int型数组
     * @return
     */
    private static List<Map> parseFile(String filePath,int lengthArray[]){
        List<Map> ZmDataList = new ArrayList<Map>();
        try {
            String encoding="gbk"; //文件是gbk编码
            File file=new File(filePath);
            if(file.isFile() && file.exists()){ //判断文件是否存在
                InputStreamReader read = new InputStreamReader(
                        new FileInputStream(file), "iso-8859-1");
                BufferedReader bufferedReader = new BufferedReader(read);
                String lineTxt = null;
                while((lineTxt = bufferedReader.readLine()) != null){
                    byte[] bs = lineTxt.getBytes("iso-8859-1");
                    //解析的结果MAP，key为对账文件列序号，value为解析的值
                    Map<Integer,String> ZmDataMap = new LinkedHashMap<Integer,String>();
                    //左侧游标
                    int leftIndex = 0;
                    //右侧游标
                    int rightIndex = 0;
                    for(int i=0;i<lengthArray.length;i++){
                        rightIndex = leftIndex + lengthArray[i];
                        String filed = new String(Arrays.copyOfRange(bs, leftIndex,rightIndex), encoding);
                        leftIndex = rightIndex+1;
                        ZmDataMap.put(i, filed);
                    }
                    ZmDataList.add(ZmDataMap);
                }
                read.close();
            }else{
                System.out.println("找不到指定的文件");
            }
        } catch (Exception e) {
            System.out.println("读取文件内容出错");
            e.printStackTrace();
        }

        return ZmDataList;
    }

    /**
     * 组装收款方信息
     * @param encoding 编码方式
     * @return 用{}连接并base64后的收款方信息
     */
    public static String getPayeeInfo(Map<String, String> payeeInfoMap,String encoding) {
        return formInfoBase64(payeeInfoMap,encoding);
    }

    /**
     * 组装收款方信息(接入机构配置了敏感信息加密)
     * @param encoding 编码方式
     * @return 用{}连接并base64后的收款方信息
     */
    public static String getPayeeInfoWithEncrpyt(Map<String, String> payeeInfoMap,String encoding) {
        return formInfoBase64WithEncrpyt(payeeInfoMap,encoding);
    }

    /**
     * 组装付款方信息
     * @param encoding 编码方式
     * @return 用{}连接并base64后的付款方信息
     */
    public static String getPayerInfo(Map<String, String> payarInfoMap, String encoding) {
        return formInfoBase64(payarInfoMap,encoding);
    }

    /**
     * 组装付款方信息(接入机构配置了敏感信息加密)
     * @param encoding 编码方式
     * @return 用{}连接并base64后的付款方信息
     */
    public static String getPayerInfoWithEncrpyt(Map<String, String> payarInfoMap, String encoding) {
        return formInfoBase64WithEncrpyt(payarInfoMap,encoding);
    }


    /**
     * 组装附加处理条件
     * @param encoding 编码方式
     * @return 用{}连接并base64后的附加处理条件
     */
    public static String getAddnCond(Map<String, String> addnCondMap,String encoding) {
        return formInfoBase64(addnCondMap,encoding);
    }

    /**
     * 用{}连接并base64
     * @param map
     * @param encoding
     * @return
     */
    public static String formInfoBase64(Map<String, String> map, String encoding){
        StringBuffer sf = new StringBuffer();
        String info = sf.append(SDKConstants.LEFT_BRACE).append(SDKUtil.coverMap2String(map)).append(SDKConstants.RIGHT_BRACE).toString();
        try {
            info = new String(AcpService.base64Encode(info, encoding));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return info;
    }

    /**
     * 用{}连接并base64(接入机构配置了敏感信息加密)
     * @param map
     * @param encoding
     * @return
     */
    public static String formInfoBase64WithEncrpyt(Map<String, String> map,String encoding){
        StringBuffer sf = new StringBuffer();
        String info = sf.append(SDKConstants.LEFT_BRACE).append(SDKUtil.coverMap2String(map)).append(SDKConstants.RIGHT_BRACE).toString();
        info = SecureUtil.encryptData(info, encoding, CertUtil.getEncryptCertPublicKey());
        return info;
    }


}
